package routers

import (
	"ginServer/modules/admin/admin_routers"
	_ "ginServer/modules/common/bootstrap"
	"ginServer/modules/common/common_middleware/common_cors"
	"ginServer/modules/common/global/consts"
	"ginServer/modules/common/global/variable"
	"ginServer/modules/common/utils/gin_release"
	"net/http"

	"github.com/gin-contrib/pprof"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// 后台相关api
func RoutersApiInit() *gin.Engine {
	var router *gin.Engine
	if variable.ConfigYml.GetBool("AppDebug") == false {
		//【生产模式】
		// 根据 gin 官方的说明：[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
		// 如果部署到生产环境，请使用以下模式：
		// 1.生产模式(release) 和开发模式的变化主要是禁用 gin 记录接口访问日志，
		// 2.go服务就必须使用nginx作为前置代理服务，这样也方便实现负载均衡
		// 3.如果程序发生 panic 等异常使用自定义的 panic 恢复中间件拦截、记录到日志
		router = gin_release.ReleaseRouter()
	} else {
		// 调试模式，开启 pprof 包，便于开发阶段分析程序性能
		router = gin.Default()
		pprof.Register(router)
	}
	// 设置可信任的代理服务器列表,gin (2021-11-24发布的v1.7.7版本之后出的新功能)
	if variable.ConfigYml.GetInt("HttpServer.TrustProxies.IsOpen") == 1 {
		if err := router.SetTrustedProxies(variable.ConfigYml.GetStringSlice("HttpServer.TrustProxies.ProxyServerList")); err != nil {
			variable.ZapLog.Error(consts.GinSetTrustProxyError, zap.Error(err))
		}
	} else {
		_ = router.SetTrustedProxies(nil)
	}
	//根据配置进行设置跨域
	if variable.ConfigYml.GetBool("HttpServer.AllowCrossDomain") {
		router.Use(common_cors.Next())
	}
	router.GET("/", func(context *gin.Context) {
		context.String(http.StatusOK, "您现在调用的是API接口")
	})

	//处理静态资源（不建议gin框架处理静态资源，参见 Public/readme.md 说明 ）
	router.Static("/public", "./public") //  定义静态资源路由与实际目录映射关系
	//router.StaticFile("/abcd", "./public/readme.md") // 可以根据文件名绑定需要返回的文件名

	// r.Use(gin.LoggerWithConfig(logger.LojigerToFile()))
	// r.Use(logger.Recover)
	// return admin_routers.AdminRoutersApiInit(r)
	admin_routers.AdminRoutersApiInit(router)
	return router
}
